package a11;

import java.awt.*;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JDKProxyDemo {

    interface Animal{
        void eat();

        void fly();
    }

    static class Target implements Animal{
        @Override
        public void eat() {
            System.out.println("target eating...");
        }

        @Override
        public void fly() {
            System.out.println("target flying");
        }
    }


    public static void main(String[] args) throws IOException {
        Target target = new Target();
        /**
         * 参数1：类加载器 动态代理运行过程中动态生成字节码文件，而这个字节码文件需要类加载器去加载
         * 参数2：要代理的接口的数组
         * 参数3：增强的执行流程
         */
        Animal proxyInstance =(Animal)Proxy.newProxyInstance(JDKProxyDemo.class.getClassLoader(), new Class[]{Animal.class}, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("before...");
                //JDK代理是基于接口的，所以target也必须是实现了相关的接口。
                Object result = method.invoke(target, args);
                System.out.println("after...");
                return result;  //注意返回方法结果
            }
        });
        //对接口中的所有方法都代理增强了(疑问：如何指定只增强指定方法的呢？这个应该也比较好解决，可以通过方法名刷选即可)
        proxyInstance.eat();
        proxyInstance.fly();
        System.out.println(proxyInstance.getClass());
        System.out.println("------------");
        System.in.read();

    }
}
